package com.datareport.config.datasource;

import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

/**
 * 动态数据源路由类
 * 继承AbstractRoutingDataSource实现数据源的动态切换
 */
@Slf4j
public class DynamicDataSource extends AbstractRoutingDataSource {

    /**
     * 获取当前线程的数据源标识
     * @return 数据源标识
     */
    @Override
    protected Object determineCurrentLookupKey() {
        String dataSource = DataSourceContextHolder.getDataSource();
        log.debug("当前数据源: {}", dataSource);
        return dataSource;
    }

    /**
     * 切换数据源
     * @param dataSourceType 数据源类型
     */
    public static void switchDataSource(DataSourceContextHolder.DataSourceType dataSourceType) {
        DataSourceContextHolder.setDataSource(dataSourceType.getCode());
        log.info("切换到数据源: {} - {}", dataSourceType.getCode(), dataSourceType.getDescription());
    }

    /**
     * 切换到业务数据库
     */
    public static void switchToBusinessDb() {
        switchDataSource(DataSourceContextHolder.DataSourceType.BUSINESS_DB);
    }

    /**
     * 切换到统计结果库
     */
    public static void switchToStatisticsDb() {
        switchDataSource(DataSourceContextHolder.DataSourceType.STATISTICS_DB);
    }

    /**
     * 切换到系统配置库
     */
    public static void switchToSystemDb() {
        switchDataSource(DataSourceContextHolder.DataSourceType.SYSTEM_DB);
    }

    /**
     * 清除数据源切换
     */
    public static void clearDataSource() {
        DataSourceContextHolder.clearDataSource();
        log.debug("清除数据源切换");
    }

    /**
     * 获取当前数据源类型
     */
    public static DataSourceContextHolder.DataSourceType getCurrentDataSourceType() {
        String dataSource = DataSourceContextHolder.getDataSource();
        return DataSourceContextHolder.DataSourceType.fromCode(dataSource);
    }
}